/*
	FluorineFx open source library 
	Copyright (C) 2007 Zoltan Csibi, zoltan@TheSilentGroup.com, FluorineFx.com 
	
	This library is free software; you can redistribute it and/or
	modify it under the terms of the GNU Lesser General Public
	License as published by the Free Software Foundation; either
	version 2.1 of the License, or (at your option) any later version.
	
	This library is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
	Lesser General Public License for more details.
	
	You should have received a copy of the GNU Lesser General Public
	License along with this library; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
using System;
using System.Text;

namespace FluorineFx.Json
{
    /// <summary>
    /// Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer.
    /// </summary>
    internal class StringBuffer
    {
        private char[] _buffer;
        private int _position;

        private static char[] _emptyBuffer = new char[0];

        public int Position
        {
            get { return _position; }
            set { _position = value; }
        }

        public StringBuffer()
        {
            _buffer = _emptyBuffer;
        }

        public StringBuffer(int initalSize)
        {
            _buffer = new char[initalSize];
        }

        public void Append(char value)
        {
            // test if the buffer array is large enough to take the value
            if (_position + 1 > _buffer.Length)
            {
                EnsureSize(1);
            }

            // set value and increment poisition
            _buffer[_position++] = value;
        }

        public void Clear()
        {
            _buffer = _emptyBuffer;
            _position = 0;
        }

        private void EnsureSize(int appendLength)
        {
            char[] newBuffer = new char[_position + appendLength * 2];

            Array.Copy(_buffer, newBuffer, _position);

            _buffer = newBuffer;
        }

        public override string ToString()
        {
            return new string(_buffer, 0, _position);
        }
    }
}